package com.miage.itrading.client;

import java.util.HashMap;
import java.util.Map;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TabBar;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.miage.itrading.client.GraphDurees.Duree;
import com.miage.itrading.shared.entites.Cotation;

public class ItradingAffichage extends FlowPanel {

	private final Map<String, GenericWidget>	mapWidget			= new HashMap<String, GenericWidget>();

	private final TabBar						durees;
	private final VerticalPanel					graphs;

	private final HeaderWidget					headerWidget;
	private final MenuWidget					menuWidget;
	private final CompanyWidget					companyWidget;
	private final SearchWidget					searchWidget;
	private final GraphWidget					graphWidget;
	private final ToolboxWidget					toolboxWidget;

	private final Widget						headerW;
	private final Widget						menuW;
	private final Widget						companyW;
	private final Widget						searchW;
	private final Widget						courbesW;
	private final Widget						toolboxW;

	private final VerticalPanel					container			= new VerticalPanel();

	private final GetListesServiceAsync			getListesService	= GWT
																			.create(GetListesService.class);

	ItradingAffichage() {

		/**
		 * Création de tous les widgets
		 */
		headerWidget = new HeaderWidget(this, "header");
		menuWidget = new MenuWidget(this, "menu");
		searchWidget = new SearchWidget(this, "search");
		companyWidget = new CompanyWidget(this, "company");
		graphWidget = new GraphWidget(this, "graph");
		toolboxWidget = new ToolboxWidget(this, "toolbox");

		mapWidget.put(headerWidget.getUID(), headerWidget);
		mapWidget.put(menuWidget.getUID(), menuWidget);
		mapWidget.put(companyWidget.getUID(), companyWidget);
		mapWidget.put(searchWidget.getUID(), searchWidget);
		mapWidget.put(graphWidget.getUID(), graphWidget);
		mapWidget.put(toolboxWidget.getUID(), toolboxWidget);

		headerW = headerWidget.createWidget();
		menuW = menuWidget.createWidget();
		searchW = searchWidget.createWidget();
		companyW = companyWidget.createWidget();
		courbesW = graphWidget.createWidget();
		toolboxW = toolboxWidget.createWidget();

		toolboxW.setStyleName("toolbox");

		/**
		 * Configuration de tous les widgets
		 */
		headerWidget.configureWidget();
		menuWidget.configureWidget();
		companyWidget.configureWidget();
		graphWidget.configureWidget();
		toolboxWidget.configureWidget();
		searchWidget.configureWidget();

		/**
		 * Affiche par défaut la page d'accueil avec les news
		 */

		/**
		 * Mise en page et affichage de la page
		 */

		/**
		 * En tête
		 */
		HorizontalPanel menu = new HorizontalPanel();
		menu.add(headerW);
		menu.add(menuW);
		menu.add(searchW);

		menu.setWidth("100%");

		menu.setCellWidth(headerW, "80%");

		menu.setCellWidth(menuW, "70%");
		menu.setCellWidth(searchW, "30%");

		menu.setStyleName("menu");

		/**
		 * Corps
		 */

		HorizontalPanel body = new HorizontalPanel();

		graphs = new VerticalPanel();

		durees = new TabBar();

		durees.addTab("Intraday");
		durees.addTab("1 semaine");
		durees.addTab("1 mois");
		durees.addTab("1 an");
		durees.addTab("Tout");

		durees.addSelectionHandler(new SelectionHandler<Integer>() {

			public void onSelection(SelectionEvent<Integer> event) {

				if (event.getSelectedItem() == 0) {
					afficheCoursIntraday(graphWidget.getCotation());

				} else if (event.getSelectedItem() == 1) {
					afficheCoursSemaine(graphWidget.getCotation());

				} else if (event.getSelectedItem() == 2) {
					afficheCoursMois(graphWidget.getCotation());

				} else if (event.getSelectedItem() == 3) {
					afficheCoursAnnee(graphWidget.getCotation());

				} else {
					afficheCoursHistorique(graphWidget.getCotation());
				}

			}
		});

		body.add(companyW);
		body.add(durees);
		body.add(graphs);
		body.add(toolboxW);

		body.setWidth("100%");
		body.setCellWidth(toolboxW, "150px");
		body.setCellWidth(companyW, "250px");
		body.setCellWidth(courbesW, "600px");

		body.setStyleName("body");

		/**
		 * Pied de page
		 */
		HorizontalPanel footer = new HorizontalPanel();

		footer.setWidth("100%");

		/**
		 * Container global
		 */
		container.add(headerW);
		container.add(menu);
		container.add(body);
		container.add(footer);

		container.setSize("980px", "100%");

		container.setCellHeight(headerW, "15%");
		container.setCellHeight(menu, "5%");
		container.setCellHeight(body, "70%");
		container.setCellHeight(footer, "10%");

		container.setStyleName("container");

		add(container);

		gestionnaireDeDonneesAjax();

		afficheAccueil();
	}

	public void afficheAccueil() {
		final AsyncCallback<Cotation> getCAC40 = new AsyncCallback<Cotation>() {

			public void onFailure(Throwable caught) {
				Window.alert("Erreur lors de l'appel serveur "
						+ caught.getMessage());

			}

			public void onSuccess(Cotation result) {
				System.out
						.println("Affichage du CAC40 au chargement de la page");
				afficheCoursIntraday(result);
			}
		};

		getListesService.getCotationByMnemo("PX1", getCAC40);
	}

	private void afficheCours(Cotation c, Duree duree) {
		companyWidget.ajouter(c);
		graphWidget.setCotation(c);

		menuWidget.initialise();
		menuWidget.pushItem(c.getNom(), null);

		graphs.clear();
		graphs.add(graphWidget.build(duree));
	}

	public void afficheCoursAnnee(Cotation c) {
		durees.selectTab(3);
		afficheCours(c, Duree.ANNEE);
	}

	public void afficheCoursHistorique(Cotation c) {
		durees.selectTab(4);
		afficheCours(c, Duree.HISTORIQUE);
	}

	public void afficheCoursIntraday(Cotation c) {
		durees.selectTab(0);
		afficheCours(c, Duree.INTRADAY);
	}

	public void afficheCoursMois(Cotation c) {
		durees.selectTab(2);
		afficheCours(c, Duree.MOIS);
	}

	public void afficheCoursSemaine(Cotation c) {
		durees.selectTab(1);
		afficheCours(c, Duree.SEMAINE);
	}

	/**
	 * Actualisation des cours historiques et lancement du thread temps réel
	 */
	public void gestionnaireDeDonneesAjax() {
		SGBDItradingAsync sgbd = GWT.create(SGBDItrading.class);

		final AsyncCallback<Void> callback = new AsyncCallback<Void>() {

			public void onFailure(Throwable caught) {
				Window.alert("Erreur lors de l'appel serveur "
						+ caught.getMessage());

			}

			public void onSuccess(Void result) {

			}
		};

		sgbd.metAJour(callback);
	}

	public GenericWidget getWidget(String widgetName) {
		return mapWidget.get(widgetName);
	}
}
